import sqliteFriend from "@/sqlite_services/friend.js";
import friendsApi from "@/services/api/friends.js";
let pendingRequests = {}; //队列避免重复请求
export default {
	state: {
		users: uni.getStorageSync('userinfos')||{}
	},
	mutations: {
		//不出意外的话，不单独删除的话，这里应该和数据库表的一致，仅用于设置不用于更新
		setUser(state, {
			userId,
			userInfo
		}) {
			// 直接使用 Vue.set 方法来合并现有用户信息和新的用户信息
			Vue.set(state.users, userId, userInfo);
			//可以考虑加到缓存中
			uni.setStorageSync('userinfos', state.users)
		},
		editUser(state, {
			userId,
			userInfo
		}) {
			//只是更新  有就更新一下子，没有就拉倒
			if (state.users[userId]) {
				// 直接使用 Vue.set 方法来合并现有用户信息和新的用户信息
				Vue.set(state.users, userId, { ...state.users[userId], ...userInfo });
				// 更新缓存中的用户信息
				uni.setStorageSync('userinfos', state.users);
			}
		}
	},
	actions: {
		async fetchUserInfo({commit,state}, {userId,fields}) {
			if (state.users[userId]) {
				return selectFields(state.users[userId], fields);
			}
			// 检查是否已有相同 userId 的请求正在进行
			if (pendingRequests[userId]) {
				return pendingRequests[userId].then(userInfo => selectFields(userInfo, fields));
			}
			
			// 创建一个新的承诺用于存储请求结果
			const userInfoPromise = (async () => {
				try {
					const userInfoDB = await sqliteFriend.getUserInfo(userId);
					if (userInfoDB) {
						//预防和数据库不同，在这里设置一下
						commit('setUser',{
							userId:userId,
							userInfo:userInfoDB
						})
						return userInfoDB;
					} else {
						const userInfoFromAPI = await friendsApi.getUserInfo(userId);
						return userInfoFromAPI;
					}
				} finally {
					delete pendingRequests[userId];
				}
			})();
			// 将该请求的承诺存储到 pendingRequests 中
		    pendingRequests[userId] = userInfoPromise;
			// 获取到结果后选择所需的字段
		    return userInfoPromise.then(userInfo => selectFields(userInfo, fields));
		}
	}
};

function selectFields(obj, fields) {
	if (!fields) {
		return obj;
	}
	const selectedInfo = {};
	fields.forEach(field => {
		if (obj.hasOwnProperty(field)) {
			selectedInfo[field] = obj[field];
		}
	});
	return selectedInfo;
}